/**
 * 数组对象遍历：
 */

/*
1. 遍历数组通常用for循环
    ES5的话也可以使用forEach，ES5具有遍历数组功能的还有map、filter、some、every、reduce、reduceRight等，只不过他们的返回结果不一样。但是使用foreach遍历数组的话，使用break或continue不能中断循环，使用return也不能返回到外层函数。
2. for in遍历数组的毛病
    1.index索引为字符串型数字，不能直接进行几何运算
    2.遍历顺序有可能不是按照实际数组的内部顺序
    3.使用for in会遍历数组所有的可枚举属性，包括原型。例如的原型方法method和name属性
    所以for in更适合遍历对象，不要使用for in遍历数组。
*/
Array.prototype.method = function () {
  console.log(this.length);
}
var myArray = [1, 2, 3]
myArray.name = "数组"
for (let index in myArray) {
  // index为string类型
  console.log(typeof index, myArray[index]);
}

/************************** */

Object.prototype.method = function () {
  console.log(this);
}
var myObject = {
  a: "1",
  b: "2",
  c: "3"
}
for (let key in myObject) {
  // hasOwnPropery方法可以判断某属性是否是该对象的实例属性,而排除原型上的方法和属性
  if (myObject.hasOwnProperty(key)) {
    console.log(key);
  }
}
console.log(Object.keys(myObject)) // 可获取对象的实例属性组成的数组，不包括原型方法和属性
console.log(Object.values(myObject)) // 可获取对象的实例属性的值组成的数组，不包括原型方法和属性




/*
for in遍历的是数组的索引（即键名），而for of遍历的是数组元素值。
除了使用for循环, for of遍历的只是数组内的元素，而不包括数组的原型属性method和索引name
*/
for (let value of myArray) {
  console.log(value);
}


/**
 1. for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是，它可以正确响应break、continue和return语句

 2. for-of循环不支持普通对象，但如果你想迭代一个对象的属性，你可以用for-in循环（这也是它的本职工作）或内建的Object.keys()方法：
    当你为对象添加myObject.toString()方法后，就可以将对象转化为字符串，同样地，当你向任意对象添加myObject.Symbol.iterator方法，就可以遍历这个对象了。
    jQuery.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];

 3. for...of循环首先调用集合的Symbol.iterator方法，紧接着返回一个新的迭代器对象。迭代器对象可以是任意具有.next()方法的对象；for-of循环将重复调用这个方法，每次循环调用一次。举个例子，这段代码是我能想出来的最简单的迭代器：
  var zeroesForeverIterator = {
  [Symbol.iterator]: function () {
    return this;
    },
    next: function () {
    return {done: false, value: 0};
  }
  };
 */
